home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl -w
- #
- # script for ispell hash autorebuild in Debian systems
- #
- # Copyright 2003-2009 Agustin Martin Domingo <agmartin@debian.org>
- #
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- #
-
- sub usage {
- print STDERR "\nUsage:\tispell-autobuildhash [--debug] [--force]\n"
- . "\n"
- . "Options:\n"
- . "\t--debug Show ispell-autobuildhash debugging information\n"
- . "\t--force Do the job regardless of versions comparisons\n";
- }
-
- sub debugprint {
- print STDERR "@_\n" if $debug;
- }
-
- sub mymessage{
- my $message = join(" ",@_);
- my $question = "dictionaries-common/ispell-autobuildhash-message";
- my $hashfile = '';
-
- if ( $dict ) {
- $hashfile = "$dict.hash";
- } else {
- $hashfile = "dictionaries-common";
- }
-
- subst($question,"xxpell","ispell");
- subst($question,"XXpell","Ispell");
- subst($question,"hashfile",$hashfile);
- subst($question,"errormsg",$message);
- fset ($question,"seen","false");
- title("dictionaries-common: Running ispell-autobuildhash");
- input("critical",$question);
- go ();
- }
-
- sub old_myerror {
- print "
- ** Error: @_
-
- This error was caused by package providing hash $dict, although it
- can be made evident during other package postinst. Please complain
- to the maintainer of package providing hash $dict. In the meantime
- you might need to remove package providing $dict.hash\n";
- myclean();
- exit 1;
- }
-
- sub myerror {
- mymessage @_;
- $build_status = "error";
- # myclean();
- # exit 1;
- }
-
- sub myclean {
- unlink <$tempfile*>;
- rmdir $tmpdir;
- }
-
-
- # ---------------------------------------------------------------------
- # What to do if a signal is trapped
- # ---------------------------------------------------------------------
-
- sub trap {
- myclean();
- exit 1
- }
-
- # ---------------------------------------------------------------------
- # Handle autorebuilding
- # ---------------------------------------------------------------------
-
- sub autorebuild {
- my $dict = shift || # The dictionary name
- myerror "No argument passed to function autorebuild";
- my $zmwl = "/usr/share/ispell/$dict.mwl.gz"; # the compressed munched wordlist
- my $aff = "/usr/lib/ispell/$dict.aff"; # the aff file
- my $hash = "/var/lib/ispell/$dict.hash"; # the hash file
- my $desc = "/usr/share/ispell/$dict.desc"; # the .desc file
-
- print STDERR "ispell-autobuildhash: Processing \'$dict\' dict\n";
-
- if ( -e $aff ){
- if ( -e $zmwl ){
- system ("gzip -dc $zmwl > $tempfile") == 0
- or myerror "Could not gunzip the munched wordlist for $dict";
- system ("buildhash -s $tempfile $aff $hash") == 0
- or myerror "Could not build the hash file for $dict" ;
-
- } elsif ( -e $desc ) {
- if ( -x "/usr/sbin/update-ispell-hash" ) {
- system ("update-ispell-hash -d $dict > /dev/null") == 0
- or myerror "Problems running update-ispell-hash for $dict";
- debugprint "Found and run update-ispell-hash";
- } elsif ( -x "/usr/sbin/update-ipolish-hash" ) {
- system ("update-ipolish-hash -d $dict > /dev/null") == 0
- or myerror "Problems running update-ipolish-hash for $dict";
- debugprint "Found and run update-ipolish-hash";
- } else {
- myerror "Could not find any of update-ispell-hash, update-ipolish-hash"
- }
- } else {
- myerror "Could not find $zmwl";
- }
- } else {
- myerror "Could not find affix file $aff";
- }
- }
-
- # ---------------------------------------------------------------------
- # Get ispell compat version
- # ---------------------------------------------------------------------
-
- sub get_ispell_compat {
- my @internal;
- my $ispell_compat;
- if ( -e $ispellcompatfile ){
- open (COMPAT,"$ispellcompatfile");
- chomp ( $ispell_compat = <COMPAT> );
- close COMPAT;
- } elsif ( -e "/usr/bin/ispell" ){
- # $ispell_compat = `ispell -v | head -n 1 | sed 's/.*Version \([^\ ]*\).*/\1/g'`
- $ispell_compat = `ispell -v | head -n 1`;
- @internal = split(" ",$ispell_compat);
- $ispell_compat = $internal[4];
- } else {
- myerror "ispell is not installed";
- }
- return $ispell_compat;
- }
-
- # ---------------------------------------------------------------------
- # The main program
- # ---------------------------------------------------------------------
-
- use Debian::DictionariesCommon q(dico_checkroot);
- use Debconf::Client::ConfModule q(:all);
- use Getopt::Long;
-
- dico_checkroot();
-
- $SIG{INT} = \&trap;
- $SIG{KILL} = \&trap;
- $SIG{TERM} = \&trap;
-
- $tmpdir = "/tmp/ispell-auto-$$";
- $tempfile = "$tmpdir/ispellhash";
- $compatdir = "/var/lib/ispell";
- $ispellcompatfile = "/usr/share/ispell/ispell.compat";
-
- $force = '';
- $debug = '';
- $build_status = '';
-
- GetOptions ('debug' => \$debug,
- 'force' => \$force) or usage();
-
- mkdir($tmpdir,0700) || die "can't mkdir $tmpdir: $!";
-
- if ( -x "/usr/bin/ispell" ){
- $ispell_compat = get_ispell_compat();
- foreach $dict ( <$compatdir/*.compat> ){
- $build_status = '';
- my $dict_compat = '';
- $dict =~ s/\.compat$//;
- $dict =~ s/.*\///;
- if ( $force ) {
- $dict_compat = "forced";
- autorebuild $dict;
- } else {
- open (COMPAT,"$compatdir/$dict.compat");
- $dict_compat = <COMPAT>;
- close COMPAT;
- $dict_compat = 0 if not $dict_compat;
- chomp $dict_compat;
- autorebuild $dict if ($ispell_compat ne $dict_compat);
- }
- debugprint "$dict => ispell_compat: [$ispell_compat]; dict_compat: [$dict_compat]";
- if ( not $build_status ){
- debugprint " +++ Updating $compatdir/$dict.compat";
- open (COMPAT,">","$compatdir/$dict.compat");
- print COMPAT "$ispell_compat\n";
- close COMPAT;
- } else {
- debugprint " --- $compatdir/$dict.compat not updated because of an error";
- }
-
- unlink <$tempfile*>;
- }
- } else {
- debugprint " ispell is not installed. Doing nothing";
- }
-
- myclean ();
-
- __END__
-
- =head1 NAME
-
- B<ispell-autobuildhash> - Autobuilding the ispell hash file for some dicts
-
- =head1 SYNOPSIS
-
- ispell-autobuildhash [--force]
-
- Options:
- --debug Show some extra ispell-autobuildhash information.
- --force Rebuild the hash file for all dicts providing a
- compat file skipping the test.
-
- =head1 DESCRIPTION
-
- B<ispell-autobuildhash> is a script that will manage ispell hash files
- autobuild, intended to be called from the dictionaries-common tools.
- Depending on the ispell
- compatibility level and on the compatibility level used for the hash file
- if present, will decide whether it must be rebuilt or not. This script will
- only work on ispell packages prepared to use it, it will do nothing for other
- ispell dict packages.
-
- =head1 OPTIONS
-
- --debug Show some extra ispell-autobuildhash information.
- --force Rebuild the hash file for all dicts providing a compat
- file regardless of the compatibility levels found.
-
- =head1 PACKAGE MAINTAINERS
-
- To use this system, just provide a F<$dict.compat> file in F</var/lib/ispell>
- (I<$dict> stands or the hash or affix file basename). Put a "0" in it or just
- create an empty one with touch. The way things are done depends on whether
- your dict has a single source or a multiple source like ipolish has.
-
- The most common case is having a single source. In this case you must put
- the F<$dict.aff> file at F</usr/lib/ispell/$dict.aff> as usual and the munched
- wordlist compressed with gzip at F</usr/share/ispell/$dict.mwl.gz>.
-
- This script supports the way ipolish allows selection of subdictionaries
- to be put in the hash file. It will detect the presence of the main
- language .desc file and call update-ipolish-hash as appropriate.
-
- Although this script looks for the existence of a update-ispell-hash script
- with supposedly similar functionality to update-ipolish-hash, this latter
- does not really exists, although it might be added at some time to ispell or
- to the dictionaries-common system, if enough demand is found.
-
- If your package provides more than one ispell dictionary you will need to
- do the steps above for each dictionary.
-
- Dictionaries-common scripts will call internally this script and create a
- hash file at F</var/lib/ispell/$dict.hash>. You must set a symlink to that
- file from F</usr/lib/ispell/$dict.hash>. You are also suggested to create
- an empty file at F</var/lib/ispell/$dict.hash> in the install target of
- your package build process. This empty file will be overwritten when the
- real hash is created, but will make the hash be removed at package
- removal without any magic being done in the postrm and will also help to
- keep track about which package owns that file.
-
- If you use B<debhelper> you may want to pass B<-Xvar/lib/ispell> option
- to B<dh_md5sums> call in your F<debian/rules> file, to avoid B<debsums>
- complaining about those hash and compat files.
-
- B<ispell> maintainer should also call this script from package postinst.
- When comparing versions it will get the ispell version from file
- F</usr/share/ispell/ispell.compat>, or if it does not exists, from the
- upstream version as given in the first line of 'B<ispell -vv> output.
-
- =head1 AUTHORS
-
- Agustin Martin <agmartin@debian.org>
-
- =cut
-
-